﻿using System;

namespace QuanLyKTX.Utilities
{
    class CNumToString
    {
        private string[] strSo = { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bẩy", "tám", "chín" };

        int a, b, c;
        //Tạo một mảng chuỗi, mỗi chuỗi có độ dài 3 ký tự
        private static string[] slipArray(string input)
        {
            int i=0;
            string[] strArray;
            int length = input.Length;
            if (length % 3 == 0)//Nếu chỗi chia hết cho 3 thì lấy độ dài bằng phần nguyên
                strArray = new string[length / 3];
            else//Nếu chỗi không chia hết cho 3 thì lấy độ dài bằng phần nguyên+1
                strArray = new string[length / 3 + 1];
            if (length < 3)
                strArray[0] = input;
            else
            {
                while (length >= 3)
                {
                    strArray[i] = input.Remove(0, length - 3);
                    input = input.Remove(length - 3, 3);
                    i++;
                    length = length - 3;
                }
                if (length > 0)
                    strArray[i] = input;
            }
            return strArray;
        }
        private string converNumToString(string[] list)
        {

            int i;
            string results="";
            int length = list.Length;
            if (length <= 3)
            {
                if (length == 1)
                    results = readThousand(list[0]);
                if (length == 2)
                    if (readThousand(list[1]) != "")
                        results = String.Format("{0} ngàn {1}", readThousand(list[1]), readThousand(list[0]));
                    else results = readThousand(list[0]);
                if (length == 3)
                {
                    if (readThousand(list[1]) != "" && readThousand(list[2]) != "")
                        results = String.Format("{0} triệu {1} ngàn {2}", readThousand(list[2]), readThousand(list[1]), readThousand(list[0]));
                    if (readThousand(list[1]) == "" && readThousand(list[2]) != "")
                        results = String.Format("{0} triệu {1}", readThousand(list[2]), readThousand(list[0]));
                    if (readThousand(list[1]) == "" && readThousand(list[2]) == "" && readThousand(list[0]) == "")
                        results = "";
                    if (readThousand(list[1]) == "" && readThousand(list[2]) == "" && readThousand(list[0]) != "")
                        results = readThousand(list[0]);
                }
            }
            if (length > 3)
            {
                string[] strArray1= new string[3];
                string[] strArray2 = new string[length - 3];
                for (i = 0; i < 3; i++)
                {
                    strArray1[i] = list[i];
                }
                for (i = 0; i < length - 3; i++)
                {
                    strArray2[i] = list[3 + i];
                }
                //Gọi đệ quy
                results = String.Format("{0} tỷ {1}", converNumToString(strArray2), converNumToString(strArray1));
            }
            return results;
        }
        //hàm đọc một chuỗi có 3 chữ số ra chữ
        private string readThousand(string input)
        {
            string output;

            input = input.Trim();
            string numStr = input;
            int length = numStr.Length;
            if (length == 1)
                output = strSo[Convert.ToInt32(input)];
            else
                output = "";
            if (length == 2)
            {
                a = Convert.ToInt32(Convert.ToString(numStr[0]));
                b = Convert.ToInt32(Convert.ToString(numStr[1]));
                if (a != 1 && a != 0)
                {
                    if (b != 5 && b != 0 && b != 1)
                        output = String.Format("{0} mươi {1}", strSo[a], readThousand(Convert.ToString(numStr[1])));
                    if (b == 5)
                        output = strSo[a] + " mươi lăm";
                    if (b == 0)
                        output = strSo[a] + " mươi";
                    if (b == 1)
                        output = strSo[a] + " mươi mốt";
                }
                if (a == 1)
                {
                    if (b != 5)//chỗ này phải thêm đoạn &&b!==0 khưng mà nó đè ở dưới rồi nên lười viết kết quả vẫn đúng
                        output = "mười " + readThousand(Convert.ToString(numStr[1]));
                    else
                        output = "mười lăm";
                    if (b == 0)
                        output = "mười";
                }
                if (a == 0)
                    output = readThousand(Convert.ToString(numStr[1]));
            }
            if (length == 3)
            {
                a = Convert.ToInt32(Convert.ToString(numStr[0]));
                b = Convert.ToInt32(Convert.ToString(numStr[1]));
                c = Convert.ToInt32(Convert.ToString(numStr[2]));
                if (a != 0)
                {
                    if (b == 0)
                    {
                        if (c == 0)
                            output = strSo[a] + " trăm";
                        else//c!=0
                            output = String.Format("{0} trăm lẻ {1}", strSo[a], readThousand(Convert.ToString(numStr[2])));
                    }
                    else//b!=0
                        output = String.Format("{0} trăm {1}", strSo[a], readThousand(Convert.ToString(numStr[1]) + Convert.ToString(numStr[2])));

                }
                if (a == 0)
                {
                    if (b == 0)
                    {
                        if (c == 0)
                            output = "";
                        else//c!=0
                            output = readThousand(Convert.ToString(numStr[2]));
                    }
                    else//b!=0
                        output = readThousand(Convert.ToString(numStr[1]) + Convert.ToString(numStr[2]));
                }
            }
            output.Trim();
            return output;
        }
        public string convertStart(string input)
        {
            bool ok = true;
            while (ok)
            {
                if (input.IndexOf("0") == 0)
                    input = input.Remove(0, 1);
                else ok = false;
            }
            string output = converNumToString(slipArray(input));
            return string.Format("{0} đồng chẳn",output);
        }
    }
}
